#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import csv

from crypt02 import *
from SQLite3_data import *


#---------------------------------------------------------------------------
def CreateMap():

    from pymaps import Map, PyMap ,Icon # import the libraries from pymaps
    # Create a map - pymaps allows multiple maps in an object
    tmap = Map()
    icon = Icon()
    tmap.zoom = 2
    # Inserts html into the hover effect
    attackpoint = "Origem do ataque"
    point = []
    maps = []
    coordenadas = []
    #   0      1       2    3      4           5        6          7
    # 'Data', 'Hora', 'IP','País','Time Zone','Cidade','Latitude','Longitude'
    for line in vars.li:
        h = "{0}:{1}".format(line[6],line[7])
        ct = "{0}</br>{1} - {2}</br>Lat: {3}</br>Lon: {4}".format(line[2],line[3],line[5],line[6],line[7])
        if (h in coordenadas):
            if not (line[2] in vars.iplist):
                j = 0
                for t in vars.pointlist:
                    if (h == vars.pointlist[j][0]):
                        vars.pointlist[j][4] = "{0}</br>{1}".format(line[2],vars.pointlist[j][4])
                    j += 1
                    pass
                vars.iplist.append(line[2])
        if (line[2] not in vars.iplist):
            vars.iplist.append(line[2])
            coordenadas.append(h)
            vars.pointlist.append([h,line[2],line[6],line[7],ct,1])
        
    k = icon.id
    for x in vars.pointlist:
        maps=[x[2],x[3],x[4],k]
        point.append(maps) 		
    tmap.setpoint(point)
    tmap.center = (0,0)
    # Put your own googl ekey here
    gmap = PyMap(key='AIzaSyDBx5uwXg0Fi8EE_9nonAcquopW-GAVyFc', maplist=[tmap])
    gmap.addicon(icon)
    # pymapjs exports all the javascript required to build the map!
    #mapcode = gmap.pymapjs()
    mapcode2 = gmap.showhtml()
    # Do what you want with it - pass it to the template or print it!
    try:
        open(vars.tmpfile,'wb').write(mapcode2)   # generate test file
        vars.tmpOk= True
    except:
        vars.tmpError=True
        passm
    try:
        if vars.map:
            os.system('firefox {0} &'.format(vars.tmpfile))
        if vars.pdf:
            print "Criando Imagem do Mapa ..."
            print "Aguardando ligação ao Google Maps"
            os.system('wkhtmltoimage {0} ./mapa.png 2>/dev/null'.format(vars.tmpfile))
            
    
    except:
        pass
    
#---------------------------------------------------------------------------
def CreateCsvSql():

    """
    Criacao do ficheiro de saida .csv
    Insercao/Leitura de registos na base de dados
    """

    if vars.csv:
        fire = csv.writer(open(vars.csvfile,'wb'))
        fire.writerow(['Data', 'Hora', 'IP','País','Time Zone','Cidade','Latitude','Longitude'])

    if vars.sql:
        a = DAOD()
        if vars.log:
            try:
                os.remove("data_error")
            except:
                pass
            error_data = open("data_error", "a")

            try:
                os.remove("myufwdata.db")
                os.remove("myufwdata.db-journal")
            except:
                pass
            a.create_ufw()
        else:
            aa = (a.get_rows("SELECT * FROM ufw"))
            for k in aa:
                bb = [xor(k[0]),xor(k[1]),xor(k[2]),xor(k[3]),xor(k[4]),xor(k[5]),xor(k[6]),xor(k[7])]
                vars.li.append(bb)
                pass
            pass

    if (vars.csv or vars.sql):
        sys.stdout.write("Em execucao ")
        sys.stdout.flush()
        for x in vars.li: 
            if vars.csv:
                fire.writerow(x)
            if vars.sql:
                if vars.log:
                    data_ok = a.add_row_ufw(xor(x[0]), xor(x[1]), xor(x[2]), xor(x[3]), xor(x[4]), xor(x[5]), xor(x[6]), xor(x[7]))
                    if not data_ok:
                        error_data.write(x[0]+" "+x[1]+" "+x[2]+" "+x[3]+" "+x[4]+" "+x[5]+" "+x[6]+" "+x[7]+"\n")
                        vars.data_error += 1
                        pass
                    pass
                pass
            if vars.li.index(x)%(len(vars.li)/vars.line_points) == 0:
                sys.stdout.write(".")
                sys.stdout.flush()
                pass
            pass
        sys.stdout.write(" OK\n\n")
        sys.stdout.flush()

    if (vars.sql and vars.log):
        error_data.close()
    pass

#---------------------------------------------------------------------------
def GeoGet(log):

    """
    Construcao da lista dos IP's e suas caracteristicas
    """

    import re
    import pygeoip
    geo = pygeoip.GeoIP('./GeoLiteCity.dat',pygeoip.MEMORY_CACHE)
    error_log = open("log_error", "w")
    for line in log: 
        vars.lines +=1
        IP=""
        if re.match("", line):
            lista = line.split(" ")
            mes = lista[0].split(" ")[0]
            dia = lista[1].split(" ")[0]
            hora = lista[2].split(" ")[0]
        if re.search("SRC=", line):
            lista = line.split("SRC=")
            IP = lista[1].split(' ')[0]
        try:
            coordenadas = geo.record_by_addr(IP)
            if vars.verbose:
	            print "\nRegisto: ", vars.lines, "\n"
	            print "Endereço IP: " , IP
	            print "Nome do País: " , coordenadas ['country_name'] 
	            print "Time Zone: " , coordenadas ['time_zone'] 
	            print "Cidade: " , coordenadas ['city'] 
	            print "Latitude: " , coordenadas ['latitude']
	            print "Longitude: " , coordenadas ['longitude']
	            print "\n"
            ctry = coordenadas ['country_name'] 
            if ctry == None: ctry =""
            tz = coordenadas ['time_zone']
            if tz == None: tz = ""
            ct = coordenadas ['city']
            if ct == None: ct = ""
            vars.li.append([ 
                    "{0:02d}/{1:02d}".format( (vars.mes.index(mes)+1), int(dia)),
                    hora,
                    IP, 
                    ctry, 
                    tz, 
                    ct,
                    str(coordenadas['latitude']),
                    str(coordenadas['longitude'])
                  ])
            
        except:
            error_log.write(line)
            vars.log_error += 1
            if vars.verbose:
                print "Falhas\n"
            continue

    print "\nNumero total de registos do log a tratar: {0}\n".format(vars.lines)
    error_log.close()

#---------------------------------------------------------------------------
def Validate_Login(user, key):

    """

    Esta função valida se o utilizador existe
    e se a sua chave de acesso está correta

    Validate_Login(user, key) -> bool
    """

    from hashlib import md5
    from SQLite3_auth import Singleton, DAO

    retvalue = False    
    sql = str("SELECT * from login WHERE nome = "+"'"+user+"'")
    validate = DAO()
    row = validate.get_row(sql)
    if row != None:
        __pass=md5()
        __pass.update(key)
        ___pass = __pass.hexdigest()
        if row[2] == ___pass:
            retvalue = True
    return retvalue
    pass

#---------------------------------------------------------------------------
class msg():
    
    """
    Classe para mensagens
    """

    def openlog_error(self,file_):
        """
        Ficheiro de entrada nao existe ou esta danificado
        """
        print "Erro na abertura do ficheiro ['{0}']".format(file_)

    def tmpOk(self,file_):
        """
        Criacao do ficheiro temporario de html
        """
        print "Criado com sucesso o ficheiro temporario ['{0}']".format(file_) 
        pass

    def tmpError(self,file_):
        """
        Erro na criacao do ficheiro temporario de html
        """
        print "Problemas na criacao do ficheiro temporario ['{0}']".format(file_)
        pass

    def htm(self):
        """
        Problemas na abertura do Programa Firefox, ou nao esta instalado ou esta corrompido
        """
        print self.__doc__

    def parser_end(self):
        """
        Mensagem final do programa
        """
        print "Registos tratados: {0}".format(len(vars.li))
        if (vars.sql and vars.log):
            print "\nRegistos inseridos na base de dados: {0}".format((len(vars.li) - vars.data_error))
        if vars.data_error != 0:
            print "\n{0} erros encontrados na insercao de registo da base de dados".format(vars.data_error)
            print "\tVerifique o ficheiro: data_error" 
        if ((vars.lines - len(vars.li)) != 0 and vars.log):
            print "\n{0} erros encontrados na extracao de dados do ficheiro de log".format(vars.lines - len(vars.li))
            print "\tVerifique o ficheiro: log_error" 
        if (vars.tmpOk and vars.map):
            print "\nCriado com sucesso o ficheiro temporario para o Google Maps : {0}".format(vars.tmpfile)
        if (not vars.tmpOk and vars.map):
            print "\nNão se conseguir criar com sucesso o ficheiro temporario para o Google Maps : {0}".format(vars.tmpfile)
        print "\n\n"

#---------------------------------------------------------------------------
class vars():

    """
    Variaveis globais ao programa
    """
    line_points = 50    # numero de pontos a escrever na linha de progresso
    li = []             # lista para guardar os dados do log para posterior tratamento
    iplist = []         # lista de ip's
    pointlist =[]       # lista de pontos
    data_error = 0      # Nº de erros de escrita na base de dados
    log_error = 0       # Nº de erros de leitura do ficheiro de log por referianciacao ao GeoIP
    lines = 0           # Nº de registos do ficheiro de enrada
    logfile = ""        # Nome do ficheiro de log
    sql = False         # Utilização da Base de dados - Criação/Leitura
    csv = False         # Criação do ficheiro CSV
    csvfile = ""        # Nome do ficheiro CSV a criar
    pdf = False         # Criação de Relatório
    mapa = False        # Criação do Mapa e visuaização em FireFox
    verbose = False     # Mostrar mensagens no ecran
    log = False         # Utilização do ficheiro log de entrada
    tmpfile = "/tmp/test.htm"   # Ficheiro temporário para a criação da página de acesso ao google maps
    tmpOk = False       # Criação do ficehrio temporário
    htmOk = False       

    # Conversão dos meses de Carateres para numericos
    mes = []
    mes.append("Jan")
    mes.append("Feb")
    mes.append("Mar")
    mes.append("Apr")
    mes.append("May")
    mes.append("Jun")
    mes.append("Jul")
    mes.append("Aug")
    mes.append("Sep")
    mes.append("Oct")
    mes.append("Nov")
    mes.append("Dec")


